/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.ipartek.formacion.gestformwww.controlador;

import com.ipartek.formacion.gestformwww.modelo.ModeloCorreo;
import com.ipartek.formacion.gestformwww.modelo.ModeloMaterial;
import com.ipartek.formacion.gestformwww.modelo.beans.Correo;
import com.ipartek.formacion.gestformwww.modelo.beans.InformeCorreo;
import com.ipartek.formacion.gestformwww.modelo.beans.Material;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Método que contruye el codigo HTML del E-Mail y lo envia
 * @author Cris & Jon & Fran
 */
public class EnviarMailPedidoAccion implements Accion {
    // Mapeamos las urls para los enlaces
    private final String visualizarcurso = "visualizar-curso-accion";
    private final String visualizarenviarcorreo = "visualizar-enviar-mail-pedido-accion";

    public AccionRouter ejecuta(HttpServlet servlet, HttpServletRequest request, HttpServletResponse response) {
        // Declaramos las variables con las que vamos a trabajar
        AccionRouter router = null;
        HttpSession session = request.getSession();
        AccionServlet as=(AccionServlet) servlet;
        ModeloCorreo mcorreo = (ModeloCorreo) servlet.getServletContext().getAttribute("ModeloCorreo");
        ModeloMaterial mmaterial = (ModeloMaterial) servlet.getServletContext().getAttribute("ModeloMaterial");
        // Recogemos la direccion de destino del fichero properties
        ResourceBundle bundlecorreo = (ResourceBundle) servlet.getServletContext().getAttribute("correo-mapeo");
        String email = bundlecorreo.getString("mail-admin");
        String aleatorio = (String) session.getAttribute("aleatorioEnviarMail");
        // Definimos las partes del email
        String asunto = request.getParameter("asunto");
        String tabla = "";
        // Recogemos los IDs de los libros a pedir
        String[] idLibro = request.getParameterValues("idLibro");
        // Y las cantidades de dichos libros
        String[] cantLibro = request.getParameterValues("cantLibro");
        // Recogemos el cuerpo del mensaje y lo formateamos para mostrar los saltos de linea
        String mensaje = request.getParameter("textoemail");
        mensaje = mensaje.replaceAll("\\n", "<br>");

        Material material = new Material();
        Correo c = new Correo();
        Timestamp fecha = new Timestamp((new Date()).getTime());
        ArrayList<Correo> mails = new ArrayList<Correo>();
        ArrayList<String> errorm = new ArrayList<String>();
        ArrayList<InformeCorreo> informes = new ArrayList<InformeCorreo>();
    
        boolean enviarMail = true;
        Integer idCurso = Integer.parseInt(request.getParameter("idCurso"));
        // Comprobacion para el F5
        if (aleatorio != null) {
            if (request.getParameter("aletorioEnviarMail") != null) {
                if (request.getParameter("aletorioEnviarMail").equals(aleatorio)) {
                    enviarMail = false;
                } else {
                    session.setAttribute("aletorioEnviarMail", request.getParameter("aletorioEnviarMail"));
                }
            }
        } else {
            session.setAttribute("aletorioEnviarMail", request.getParameter("aletorioEnviarMail"));
        }

        if (!Verificador.esCorrecto(mensaje) && !Verificador.esCorrecto(asunto)) {
            errorm.add("error-mail-no-valido");
        }
        
        if (!Verificador.esEmail(email)) {
            errorm.add("error-direccion-no-valida");
        }
       
        if (!errorm.isEmpty()) {
            enviarMail = false;
        }
        // Creamos la cabecera de la tabla de pedido
        if (session.getAttribute("usuario") != null && idCurso != null && request.getMethod().equalsIgnoreCase("POST")) {
            if (enviarMail == true) {

            tabla = "<table width='100%'>" +
                        "<thead>" +
                            "<tr>" +
                            "<th width='25%'>ISBN</th>" +
                            "<th width='25%'>Titulo</th>" +
                            "<th width='25%'>Editorial</th>" +
                            "<th width='25%'>Cantidad</th>" +
                            "</tr>" +
                        "</thead>" +
                    "</table>";
            // Creamos el cuerpo de la tabla
            for (int i = 0; i < idLibro.length; i++) {
                try {
                    material = mmaterial.getMaterial(Integer.parseInt(idLibro[i]));
                    material.setCantidadPedido(Integer.parseInt(cantLibro[i]));
                } catch (GestorFormacionExcepcion ex) {
                    Logger.getLogger(EnviarMailPedidoAccion.class.getName()).log(Level.SEVERE, null, ex);
                }
                
    tabla = tabla + "<table width='100%'>" +
                        "<tr>" +
                        "<td width='25%' colspan='1'>" +
                            "<center>" +
                            "<label>" + material.getIsbn() + "</label>" +
                            "</center>" +
                        "</td>" +
                        "<td width='25%' colspan='1'>" +
                            "<center>" +
                            "<label>" + material.getLibTitulo() + "</label>" +
                            "</center>" +
                        "</td>" +
                        "<td width='25%' colspan='1'>" +
                            "<center>" +
                            "<label>" + material.getLibEditorial() + "</label>" +
                            "</center>" +
                         "</td>" +
                         "<td width='25%' colspan='1'>" +
                            "<center>" +
                            "<label>" + material.getCantidadPedido() + "</label>" +
                            "</center>" +
                         "</td>" +
                    "</tr>";
                    }
    tabla = tabla + "<tr>" +
                "</table>";
                // Añadimos las observaciones como cuerpo del mensaje
                if (!mensaje.isEmpty()) {
                    tabla = tabla + "<br>" + "<label><b>" + "Observaciones:" + "</b></label>";
                }

            }
            if (enviarMail) {
                //Enviar Mail
                c = new Correo();
                c.setDestinatario(email);
                c.setAsunto(asunto);
                c.setTabla(tabla);
                c.setCuerpo(mensaje);
                c.setCurId(idCurso);
                c.setFecha(fecha);
                    
                try {
                    mcorreo.envioPedido(c, servlet.getServletContext());
                } catch (GestorFormacionExcepcion ex) {
                    Logger.getLogger(EnviarCorreoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    request.setAttribute("errores", errorm);
                    try {
                        router=as.getFactory().getAction(as.getNombreClaseRecurso(visualizarcurso),servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                    } catch (ClassNotFoundException ex1) {
                        Logger.getLogger(EnviarCorreoAccion.class.getName()).log(Level.SEVERE, null, ex1);
                    } catch (InstantiationException ex1) {
                        Logger.getLogger(EnviarCorreoAccion.class.getName()).log(Level.SEVERE, null, ex1);
                    } catch (IllegalAccessException ex1) {
                        Logger.getLogger(EnviarCorreoAccion.class.getName()).log(Level.SEVERE, null, ex1);
                    }
                }
                // Creamos los datos del informe
                InformeCorreo inf = new InformeCorreo();
                inf.setNombre("Administración");
                inf.setApellidos("Ipartek");
                inf.setDireccion(email);
                inf.setAsunto(c.getAsunto());
                inf.setCuerpo(c.getCuerpo());
                inf.setEnviado(c.isEnviado());
                inf.setFecha(c.getFecha());
                informes.add(inf);
                
                request.setAttribute("informe", informes);
                request.setAttribute("contenido", "visualizar-informe-email");
                request.setAttribute("idCurso", idCurso);
                router = new AccionRouter("principal", true);

            } else {
                request.setAttribute("errores", errorm);
                try {
                    router=as.getFactory().getAction(as.getNombreClaseRecurso(visualizarenviarcorreo),servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(EnviarCorreoAccion.class.getName()).log(Level.SEVERE, null, ex);
                } catch (InstantiationException ex) {
                    Logger.getLogger(EnviarCorreoAccion.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IllegalAccessException ex) {
                    Logger.getLogger(EnviarCorreoAccion.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        } else {
            router = new AccionRouter("inicio");


        }
        return router;
    }

}
